#include <my_header.h>

// 定义一个枚举类型，分别代表进程"忙"和"空闲"
enum{
    BUSY,
    FREE
};

// 定义：用来追踪进程池中，进程的信息和状态
typedef struct worker_status_s
{
    int pid;    //进程 ID
    int status; // 进程的状态：忙或空闲
    int socket_local_fd; // socket本地通信文件描述符；用于
                         // main和子进程通信
}worker_status_t;

// 根据指定数量初始化进程池
// 第一个参数记录进程池中进程状态的数组(传入传出参数)
// 第二个进程池中：要创建的进程个数
// 返回值：0代表初始化成功，其他数字代表失败
int initWorkerArr(worker_status_t *p,int num);

// 根据端口和ip构建服务端的网络监听
// 第一个参数socket的文件描述符(传入传出参数)
// 第二个参数ip地址
// 第三个参数端口
// 返回值：0代表构建成功，-1代表失败
int initTcpSocket(int *socketfd, char *ip, char *port);

// 给epoll添加要监听的文件描述符
// 第一个参数epoll的文件描述符
// 第二个参数要监听的文件描述符
int epoll_addfd(int epollfd, int filefd);

// 把监听的连接交给某个空闲的进程
// 第一个参数accept获取连接对象的文件描述符
// 第二个参数进程池的数组
// 第三个参数进程池中进程池的个数

int toProcessPollDealNext(int net_fd, worker_status_t *p, int num );

//启动一个工作进程
//第一个参数用于和本地通信的文件描述符
int startWorker(int socket_local_fd);

// 工作进程,从本地socket中读取main进程发过来的客户端连接对象
// 第一个参数main进程和工作进程通信的文件描述符
// 第二个参数客户端连接对象的文件描述符 
int read_net_fd(int socket_local_fd, int *netfd);

// 工作进程，main进场从accept获取的客户端连接发送给工作进程
// 第一个参数main进程和工作进程通信的文件描述符
// 第二个参数main进程accpet客户端对象的文件描述符
int write_net_fd(int socket_local_fd, int *netfd);

// 根据客户端连接文件对象和客户端通信
// 第一个参数客户端连接的文件描述符
int netClinet(int net_fd);  

